package net.sk.china.city.service.impl;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import net.sk.china.city.domain.ArInventory;
import net.sk.china.city.domain.dto.donate.DonateSourceDTO;
import net.sk.china.city.domain.vo.AddInventoryVO;
import net.sk.china.city.domain.vo.ArInventoryVO;
import net.sk.china.city.mapper.ArDonateSourceMapper;
import net.sk.china.city.mapper.ArInventoryMapper;
import net.sk.china.city.service.IArInventoryService;
import net.sk.china.city.utils.DateUtils;
import net.sk.china.city.utils.SecurityUtils;
import net.sk.china.common.exception.ServiceException;
import net.sk.china.city.utils.PlatformIdHolder;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 商品库存Service业务层处理
 *
 * @author gxf
 * @date 2024-04-29
 */
@Service
public class ArInventoryServiceImpl implements IArInventoryService {
    @Autowired
    private ArInventoryMapper arInventoryMapper;

    @Autowired
    private ArDonateSourceMapper arDonateSourceMapper;

    /**
     * 查询商品库存
     *
     * @param id 商品库存主键
     * @return 商品库存
     */
    @Override
    public ArInventory selectArInventoryById(Long id) {
        return arInventoryMapper.selectArInventoryById(id);
    }

    /**
     * 查询商品库存列表
     *
     * @param arInventory 商品库存
     * @return 商品库存
     */
    @Override
    public List<ArInventoryVO> selectArInventoryList(ArInventory arInventory) {
        arInventory.setPlatformId(PlatformIdHolder.getPlatformId());
        List<ArInventory> arInventories = arInventoryMapper.selectArInventoryList(arInventory);
        List<ArInventoryVO> arInventoryVOS = new ArrayList<>();
        for (ArInventory inventory : arInventories) {
            ArInventoryVO arInventoryVO = new ArInventoryVO();
            BeanUtils.copyProperties(inventory, arInventoryVO);
            String color = inventory.getColor();
            String size = inventory.getSize();
            String specifications = inventory.getSpecifications();

            arInventoryVO.setSpecification(color, size, specifications);
            List<Long> sourceIds = JSONArray.parseArray(inventory.getSourceId(), Long.class);
            List<String> sourceNames = new ArrayList<>();
            for (Long sourceId : sourceIds) {
                String name = arDonateSourceMapper.selectById(sourceId).getDonateName();
                sourceNames.add(name);
            }
            arInventoryVO.setSourceNames(sourceNames);
            arInventoryVOS.add(arInventoryVO);
        }
        return arInventoryVOS;
    }

    /**
     * 新增商品库存
     *
     * @param arInventory 商品库存
     * @return 结果
     */
    @Override
    public int insertArInventory(ArInventory arInventory) {
        arInventory.setCreateTime(LocalDate.now());
        return arInventoryMapper.insertArInventory(arInventory);
    }

    /**
     * 修改商品库存
     *
     * @param arInventory 商品库存
     * @return 结果
     */
    @Override
    public int updateArInventory(ArInventory arInventory) {
        arInventory.setUpdateTime(LocalDate.now());
        return arInventoryMapper.updateArInventory(arInventory);
    }

    /**
     * 批量删除商品库存
     *
     * @param ids 需要删除的商品库存主键
     * @return 结果
     */
    @Override
    public int deleteArInventoryByIds(Long[] ids) {
        return arInventoryMapper.deleteArInventoryByIds(ids);
    }

    /**
     * 删除商品库存信息
     *
     * @param id 商品库存主键
     * @return 结果
     */
    @Override
    public int deleteArInventoryById(Long id) {
        return arInventoryMapper.deleteArInventoryById(id);
    }

    /**
     * 新增入库
     *
     * @param addInventoryVO
     * @return
     */
    @Override
    public int addArInventory(AddInventoryVO addInventoryVO) {
        if (addInventoryVO.getArDonateSources() == null || addInventoryVO.getArDonateSources().get(0).getId() == null)
            throw new ServiceException("入库失败，捐赠来源不能为空");
        if (arInventoryMapper.selectAddInventoryByProCode(addInventoryVO.getProCode()) != null)
            throw new ServiceException("入库失败，已存在该商品");
        ArInventory arInventory = new ArInventory();

        BeanUtils.copyProperties(addInventoryVO, arInventory);
        String color = addInventoryVO.getColor();
        String size = addInventoryVO.getSize();
        String specifications = addInventoryVO.getSpecifications();
        if ((size == null || size.isEmpty()) && (color == null || color.isEmpty() && (specifications == null || specifications.isEmpty())))
            arInventory.setSpecifications("默认");
        List<String> ids = new ArrayList<>();
        List<DonateSourceDTO> arDonateSources = addInventoryVO.getArDonateSources();
        if (arDonateSources != null) {
            for (DonateSourceDTO arDonateSource : arDonateSources) {
                ids.add(arDonateSource.getId().toString());
            }
            arInventory.setSourceId(JSON.toJSONString(ids));
        }
        arInventory.setInventoryFlag("1");
        arInventory.setCreateBy(SecurityUtils.getUsername());
        arInventory.setCreateTime(LocalDate.now());
        arInventory.setPlatformId(PlatformIdHolder.getPlatformId());
        if (arInventoryMapper.insertArInventory(arInventory) == 0)
            throw new ServiceException("入库失败");
        return 1;
    }

    /**
     * 新增出库
     *
     * @param
     * @return
     */
    @Override
    public int outArInventory(ArInventory arInventory) {
        ArInventory arInventory1 = arInventoryMapper.selectAddInventoryByProCode(arInventory.getProCode());
        if (arInventory1 == null)
            throw new ServiceException("出库失败，不存在该入库商品编码");
        Integer inventory = arInventory1.getInventory() - arInventory.getOutboundNumber();
        if (inventory < 0)
            throw new ServiceException("出库失败，库存数量不足");

        //出库信息
        arInventory.setColor(arInventory1.getColor());
        arInventory.setSize(arInventory1.getSize());
        arInventory.setSpecifications(arInventory1.getSpecifications());
        arInventory.setProductId(arInventory1.getProductId());
        arInventory.setProCode(arInventory1.getProCode());
        arInventory.setProductName(arInventory1.getProductName());
        arInventory.setSourceId(arInventory1.getSourceId());
        arInventory.setInventory(null);
        arInventory.setInventoryFlag("2");
        arInventory.setUpdateBy(SecurityUtils.getUsername());
        arInventory.setUpdateTime(LocalDate.now());
        arInventory.setPlatformId(PlatformIdHolder.getPlatformId());
        if (arInventoryMapper.insertArInventory(arInventory) == 0)
            throw new ServiceException("出库失败");

        //修改库存
        arInventory1.setInventory(inventory);
        if (arInventoryMapper.updateArInventory(arInventory1) == 0)
            throw new ServiceException("出库失败");
        return 1;
    }

    @Override
    public ArInventory getAddArInventory(String proCode) {
        ArInventory arInventory = arInventoryMapper.selectAddInventoryByProCode(proCode);
        if (arInventory == null)
            throw new ServiceException("无该商品编码信息");
        if (arInventory.getInventory() < 1)
            throw new ServiceException("该商品入库库存不足");
        return arInventory;
    }
}
